package com.ungs.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.ungs.dao.SolicitudCompraDAO;
import com.ungs.entities.OrdenTrabajo;
import com.ungs.entities.SolicitudCompra;
import com.ungs.utils.Constantes;

public class SolicitudCompraDAOImpl extends EntidadDAOImpl<SolicitudCompra>
		implements SolicitudCompraDAO {

	@SuppressWarnings("unchecked")
	@Override
	public SolicitudCompra getUltimaSolicitudCompra() throws HibernateException {
		SolicitudCompra solicitudCompra = null;
		List<SolicitudCompra> solicitudCompraList = new ArrayList<SolicitudCompra>();

		logger.info("Obteniendo la ultima solicitud de compra");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(
					SolicitudCompra.class);
			criteria.setMaxResults(1);
			criteria.add(Restrictions.eq("estadoLogico", "A"));
			criteria.addOrder(Order.desc("id"));

			solicitudCompraList = (List<SolicitudCompra>) criteria.list();

			if (solicitudCompraList.size() > 0)
				solicitudCompra = solicitudCompraList.get(0);

		} catch (HibernateException he) {
			logger.error("Error al traer la ultima solicitud de compra: "
					+ SolicitudCompra.class + "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}

		return solicitudCompra;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudCompra> getSolicitudCompraSinFinalizar()
			throws HibernateException {
		List<SolicitudCompra> solicitudCompraList = new ArrayList<SolicitudCompra>();

		logger.info("Obteniendo la lista de solicitud de compra sin finalizar");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(
					SolicitudCompra.class);
			criteria.add(Restrictions.not(Restrictions.eq("estado",
					Constantes.ESTADO_SC_COMPLETO)));

			solicitudCompraList = (List<SolicitudCompra>) criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al traer la lista de SC sin finalizar: "
					+ SolicitudCompra.class + "DAO");
			manejaExcepcion(he);
			throw he;
		} finally {
			getSession().close();
		}
		return solicitudCompraList;
	}

	@Override
	public SolicitudCompra getSolicitudCompraByCodigo(String codigo)
			throws HibernateException {
		SolicitudCompra solicitudCompra = null;

		logger.info("Obteniendo solicitud de compra por codigo");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(OrdenTrabajo.class);
			criteria.add(Restrictions.eq("numIdentificatorio", codigo));

			solicitudCompra = (SolicitudCompra) criteria.uniqueResult();

		} catch (HibernateException he) {
			logger.error("Error al traer la solicitud de compra por codigo: "
					+ SolicitudCompra.class + "DAO");
			manejaExcepcion(he);
			throw he;
		}
		return solicitudCompra;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<SolicitudCompra> getAllSolicitudCompraByOrdenTrabajo(
			OrdenTrabajo ordenTrabajo) throws HibernateException {
		List<SolicitudCompra> solicitudCompraList = new ArrayList<SolicitudCompra>();

		logger.info("Obteniendo la lista de solicitud de compra por OT");
		try {
			iniciaConexion();
			Criteria criteria = getSession().createCriteria(OrdenTrabajo.class);
			Criteria critOT = criteria.createCriteria("ordenTrabajo");
			critOT.add(Restrictions.eq("id", ordenTrabajo.getId()));

			solicitudCompraList = (List<SolicitudCompra>) criteria.list();

		} catch (HibernateException he) {
			logger.error("Error al traer las solicitudes de compra por OT: "
					+ SolicitudCompra.class + "DAO");
			manejaExcepcion(he);
			throw he;
		}
		return solicitudCompraList;
	}

}
